﻿package com.view
{
	import flash.display.*;
	import flash.events.Event;
	import com.application.ApplicationDefault;
	
	import fl.data.DataProvider;
	import com.tools.SkinManager;
	import com.tools.SoundManager;
	import com.tools.SkinLoader;
	import com.tools.PlayerContextMenu;
	
	import com.tools.notifications.AvailableDataEvent;
	import com.tools.notifications.SkinEvent;
	
	import com.conf.PlayerSpec;
	
	/////////////////////////////////////////////////////////////////////////////////////////////////////////
	// PlayerView ::
	// - implémente le design pattern MVC
	/////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	public class PlayerView extends MovieClip
	{
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		// MEMBRES DE CLASSE
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		private var current_skin				: String = PlayerSpec.AVAILABLE_SKINS[ PlayerSpec.INDEX_DEFAULT_SKIN ].location;
		private var skin_repository				: String = PlayerSpec.SKIN_REPOSITORY;
		private var img_repository				: String = PlayerSpec.IMG_REPOSITORY;
		
		private var xmlFormat					: String = PlayerSpec.XML_FORMAT;
			
		private var model						: Object;
		private var controller					: Object;
		
		private var _skinManager				: SkinManager = SkinManager.getInstance( );
		private var _soundManager				: SoundManager = SoundManager.getInstance( );
		private var graphicSkin					: SkinLoader;
		
		private var firstload					: Boolean = true;
		private var skinXmlLink					: String;
		private var _skinElementFolder			: String;
		private var skinName					: String;
		private var myArray						: Array;
		private var loadedElems					: Number = 0;
		
		private var playerContextMenu			: PlayerContextMenu;
		
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		// CONSTRUCTEUR
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		function PlayerView ( model : Object, controller : Object )
		{
			this.model = model;
			this.controller = controller;
			this.model.registerView ( this );
			playerContextMenu = new PlayerContextMenu( this, this.stage );
			playerContextMenu.handleMenuState ( PlayerSpec.INDEX_DEFAULT_SKIN );
		}
		
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		// METHODES PUBLIQUES : INITIALISATION DU PLAYER (VIEW) / MISE A JOUR DE L'AFFICHAGE
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		// on initialise le xml contenant les données de la skin
		public function initPlayerView( firstload : Boolean, contextClick : String = null ) : void
		{
			// si c'est le premier lancement du FlashPlayer, on met la skin par défaut
			if( firstload )
			{
				skinName = current_skin;
				// on crée la variable pour l'url du xml qui contient toutes les infos nécessaires au chargement de la skin
				skinXmlLink = skin_repository + skinName + "/" + skinName + xmlFormat;
				skinElementFolder = skin_repository + skinName + "/" + img_repository;
				// trace( "skin link : "+ skinXmlLink + " / skin folder : " + skinElementFolder );
			}
			else if ( contextClick )
			{
				trace("ON DEMANDE LE CHARGEMENT DE ::: " + contextClick );
				this.model.skinsList 	= new Array();
				skinXmlLink				= null;
				skinElementFolder		= null;
				skinName				= null;
				
				skinName 				= contextClick;
				skinXmlLink 			= skin_repository + skinName + "/" + skinName + xmlFormat;
				skinElementFolder 		= skin_repository + skinName + "/" + img_repository;
			}
			else throw new Error( "écrire à cet endroit le changement de skin en cours d'utilisation");
			preloadSkin( skinXmlLink );
		}
		
		// méthode d'implémentation de la mise à jour de l'affichage (pattern Observer)
		public function update () : void
		{
			
			// base class code : this.Skins_list.dataProvider = new DataProvider( this.model.getSkins( ) );
		}
		
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		// METHODES PRIVEES : PROCESSUS DE GENERATION DE L'AFFICHAGE
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		// on commence par précharger puis parser les données à partir d'un xml
		private function preloadSkin ( target : String ) : void
		{
			trace( "{ " + skinName +" }");
			this.model.currentSkin = skinName;
			this.model.launch( target, PlayerSpec.DISPATCH_SKIN_EVENT_TYPE );
			this.model.xmlParser.addEventListener( AvailableDataEvent.SKIN_DATA_READY, buildInterface, false);
		}
		
		// une fois les données du xml chargées et parsées, on met à jour le layout
		private function buildInterface ( pEvt : AvailableDataEvent ) : void
		{
			_skinManager.preGenerateDisplay( this );
			_skinManager.generateDisplay ( this.model.skinsList );
			_skinManager.addEventListener( SkinEvent.SKIN_COMPLETE, loadSound );
		}
		
		private function loadSound( pEvt : SkinEvent ) : void
		{
			_soundManager.init( );
		}
		
		// à voir à supprimer cette méthode ...
		private function addToDisplayElement ( pObj : Object ) : void
		{
			if ( pObj.success )
			{
				//addChild();
			}
		}
		
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		// GETTER & SETTER
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public function set skinElementFolder( pStr : String )
		{
			_skinElementFolder = pStr;
		}
		
		public function get skinElementFolder( ) : String
		{
			return _skinElementFolder;
		}
	}
}